package com.kx.push.controller;

import com.kx.base.dto.push.MessageDTO;
import com.kx.base.result.R;
import com.kx.push.pojo.Message;
import com.kx.push.server.WebSocketServer;
import com.kx.push.service.PushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 处理推送问题
 * 指定用户id
 * 指定推送内容
 * 主动给前端推送数据
 *
 * @Author Sun
 * @Date 2021/7/26 11:02
 */
@RestController
@RequestMapping("kx/push")
public class WebPushController {

    @Autowired
    private WebSocketServer webSocketServer;

    @Autowired
    private PushService pushService;

    @PostMapping("web")
    public R sendWeb(@RequestBody MessageDTO messageDTO) {
        Long uid = messageDTO.getUid();
        String message = messageDTO.getMessage();
        Integer serviceId = messageDTO.getServiceId();
        Long requestId = messageDTO.getRequestId();
        //判断requestId在数据库中是否存在,就说明持久化成功,如果存在说明推送成功,如果不存在推送失败
        if(pushService.isIdem(requestId)){
            //如果存在就说明已经处理过了，就返回“推送成功”
            return R.ok(200,"推送成功");
        }

        //调用WebSocket发送消息
        boolean result = webSocketServer.sendInfo(uid + "", message);
        //封装数据到msg对象中
        Message msg = new Message();
        msg.setUid(uid);
        msg.setServiceId(serviceId);
        msg.setContent(message);

        if (result) {
            //将推送信息保存到数据库中，state=1，需要保证接口的幂等性，所以需要一个全局唯一id
            msg.setState(1);
            pushService.saveMessage(msg,requestId);
            return R.ok(200,"推送成功");
        } else {
            //将推送信息保存到数据库中，state=0，需要保证接口的幂等性，所以需要一个全局唯一id
            msg.setState(0);
            pushService.saveMessage(msg,requestId);
            return R.ok(201,"用户离线，推送任务已经设置。");
        }
    }
}
